#include <iostream>
#include <vector>
using namespace std;

const int MAXN = 200005; // 根据题目需求调整大小
vector<int> G[MAXN];     // 邻接表，G[u]存储与u相连的所有节点

bool visited[MAXN];      // 标记节点是否被访问
int visitedCount = 0;    // 已访问的节点数

// 深度优先搜索函数
void dfs(int node  ) {
  // if (visited[node]) {
  //   return;
  // }
  // visited[node] = true;
  visitedCount++;

  // 遍历所有邻接节点
  // for(int i=0;i<G[node].size();i++){
  //   int son=G[node][i];
  // }
  for (int son : G[node]) {     
    if( !visited[son]){
       dfs(son );
       visited[son]=true;
    }
   
  }
}

int main() {

  int N; // 节点总数·
  // 读取节点数
  cin >> N;

  // 构建图
  for (int i = 1; i <= N; i++) {
    int x, y;
    cin >> x >> y;

    if (x == 0 && y == 0) {
      // 孤立节点，直接连接到虚拟节点0
      G[0].push_back(i);
    } else {
      // 连接到两个父节点
      G[x].push_back(i);
      G[y].push_back(i);
    }
  }

  // 从虚拟节点0开始进行深度优先搜索
  dfs(0 );

  // 输出结果（减去虚拟节点0）
  cout << visitedCount - 1 << endl;

  return 0;
}